//============================================================================
// Nombre		: GeneradorIUC.cpp
// Materia		: Organizacion de Datos (75.06) - FIUBA
// Catedra		: AZCURRA-GUTIERREZ-SANTOS
// Autor		: Tkaczyszyn, Muszalski, Gallinal, Fernandez
// Descripcion	: TPDatos , Ansi-style
//============================================================================
//

#include "GeneradorIUC.h"

const int CANTIDAD_CARACTERES = 36; //TODO reemplazar esto por el lenght del vector
const char CAR_ALFANUM[CANTIDAD_CARACTERES] = {
			'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I',
			'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
		};


GeneradorIUC* GeneradorIUC::pInstance = 0;// Inicializamos el puntero

GeneradorIUC::GeneradorIUC()
{
	posicionIUC = 0;
	for (int i = 0;i<IUC::CANTIDAD_POSICIONES;i++)
		posicionCaracteres[i] =0;
}


GeneradorIUC* GeneradorIUC::getInstancia()
{
	if (pInstance == 0)  // ¿Es la primera llamada?
	{
		pInstance = new GeneradorIUC(); // Creamos la instancia
	}
	return pInstance; // Retornamos la dirección de la instancia
}

/**
 *TODO asegurarse que en el caso de que empiece de vuelta (se supero el maximo de claves) informe que hay claves repetidas
 * @return rdo un nuevo IUC
 */
IUC* GeneradorIUC::generarNuevoIUC()
{
	bool flagCambio = false;
	IUC* rdo = new IUC();

	for(int i = IUC::CANTIDAD_POSICIONES-1; i > -1; i--)
	{
		if (!flagCambio)
		{
			if(posicionCaracteres[i] < CANTIDAD_CARACTERES)
			{
				rdo->id[i] = CAR_ALFANUM[posicionCaracteres[i]];
				posicionCaracteres[i]++;
				flagCambio = true;
			}
			else if(posicionCaracteres[i] >= CANTIDAD_CARACTERES)
			{
				posicionCaracteres[i] = 0;
				rdo->id[i] = CAR_ALFANUM[posicionCaracteres[i]];

				if (posicionCaracteres[i-1]< CANTIDAD_CARACTERES)
				{
					posicionCaracteres[i-1]++;
					rdo->id[i-1] = CAR_ALFANUM[posicionCaracteres[i-1]];
					flagCambio = true;
				}
			}
		}
		else
			rdo->id[i] = CAR_ALFANUM[posicionCaracteres[i]];
	}
	ultimoIUC = rdo;
	return rdo;
}


IUC *GeneradorIUC::getUltimoIUC() const
{
    return ultimoIUC;
}


void GeneradorIUC::setUltimoIUC(IUC *ultimoIUC)
{
    this->ultimoIUC = ultimoIUC;
}

GeneradorIUC::~GeneradorIUC()
{

}


